/* 
 * File:   Lexema.h
 * Author: Pedro
 *
 * Created on 18 de Agosto de 2010, 17:20
 */

#ifndef LEXEMA_H
#define	LEXEMA_H
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include "../TiposDeLexema.h"
#include "../tipos_definidos.h"
class TabelaHash;


using namespace std;


class Lexema : public string  {
public:
    Lexema();
    virtual ~Lexema();

    Lexema operator=(const string& lexema){
        string::operator=(lexema);
    }

    Lexema operator=(const char* ____s){
        string::operator =(____s);
    }

    static bool IsSimbolo(char c){

         switch(c){

             case '=':
             case '+':
             case '-':
             case '/':
             case '(':
             case ')':
             case '*':
             case ';':
             case ',':
             case'{':
             case'}':
             case '!':
             case '<':
             case '>':
                 return true;
                 break;
             default:
                 return false;
                 break;
           }

      }

    static bool IsNumero(char c){

         return ((c == '0') || (c=='1')
                 || (c=='2')|| (c=='3')||
                 (c=='4')|| (c=='5')||
                 (c=='6')|| (c=='7')||
                 (c=='8')|| (c=='9'));

       }

    static bool IsSimboloDuplo(char c){

        return (c=='+') || (c=='-') || (c=='*') || (c=='=') || (c=='!') || (c=='/') ||
               (c=='<');

    }

    static TiposDeLexema retornaTipo(string lexema){

      for(int i = 0; i < NUMRESERVADAS; i++){

          if(lexema.compare(SimbolosReservados[i])==0)
              return Palavra_reservada;

      }

      if(lexema[0]=='"')
          return Constante_string;
      if(Lexema::IsNumero(lexema[0]))
          return Constante_Numerica;

      return _Identificador;

  }


    static bool DeterminaSimboloDuplo(string simbolo){

        char c = simbolo[1];
        switch(simbolo[0]){

            case '+':
                return (c=='=') || (c=='+');
            case '-':
                return (c=='=') || (c=='-');
            case '*':
                return (c=='=') || (c=='/');
            case '/':
                return (c=='/') || (c=='=') || (c=='*');
            case '>':
                return (c=='=');
            case '!':
                return (c=='=');
            case '=':
                return (c=='=') || (c=='>');
            default:
                return false;
        }

    }
    virtual bool ValidaLexema();
    virtual int RetornaToken();
private:


};

#endif	/* LEXEMA_H */

